optional_ref.hppnamespace type_safe
{
template <typename T, bool XValue>
class reference_optional_storage;
template <typename T>
using optional_ref = basic_optional<reference_optional_storage<T>>;
template <typename T>
optional_ref<T> opt_ref(const object_ref<T>& ref) noexcept;
template <typename T>
optional_ref<const T> opt_cref(const object_ref<T>& ref) noexcept;
template <typename T>
optional_ref<T> opt_ref(T& ref) noexcept;
template <typename T>
optional_ref<const T> opt_cref(const T& ref) noexcept;
template <typename T>
optional_ref<T> opt_ref(optional<T>& opt) noexcept;
template <typename T>
optional_ref<const T> opt_cref(const optional<T>& opt) noexcept;
template <typename T>
optional_ref<T> opt_ref(T* ptr) noexcept;
template <typename T>
optional_ref<const T> opt_cref(const T* ptr) noexcept;
template <typename T>
using optional_xvalue_ref = basic_optional<reference_optional_storage<T, true>>;
template <typename T>
optional_xvalue_ref<T> opt_xref(T* ptr) noexcept;
template <typename T>
optional_xvalue_ref<T> opt_xref(T& obj) noexcept;
template <typename T>
optional<typename std::remove_const<T>::type> copy(const optional_ref<T>& ref);
template <typename T>
optional<T> move(const optional_xvalue_ref<T>& ref) noexcept('hidden');
}
type_safe::reference_optional_storage [optional]template <typename T, bool XValue>
class reference_optional_storage
{
public:
using value_type = object_ref<T, XValue>;
using lvalue_reference = T&;
using const_lvalue_reference = lvalue_reference;
using rvalue_reference = 'hidden';
using const_rvalue_reference = rvalue_reference;
template <typename U>
using rebind = reference_optional_storage<U, XValue>;
reference_optional_storage() noexcept;
template <typename U, typename = decltype(std::declval<T*&>()=std::declval<U*>())>
)>void create_value(const basic_optional<reference_optional_storage<U, XValue>>& ref);
void create_value(const reference_optional_storage& other) noexcept;
void create_value(const object_ref<T, XValue>& other) noexcept;
void create_value(std::nullptr_t) noexcept;
template <typename U, typename = decltype(std::declval<T*&>()=std::declval<U*>())>
)>void create_value_explicit(U& obj) noexcept;
void create_value_explicit(T&&) = delete;
void copy_value(const reference_optional_storage& other) noexcept;
void swap_value(reference_optional_storage& other) noexcept;
void destroy_value() noexcept;
bool has_value() const noexcept;
'hidden' get_value() const noexcept;
'hidden' get_value_or(lvalue_reference other) const noexcept;
result_type get_value_or(T&&) const = delete;
};
A StoragePolicy for ts::basic_optional that allows optional references.
The actual value_type passed to the optional is ts::object_ref, but the reference types are normal references, so value() will return a T& and value_or() takes a fallback reference of the same type and returns one of them. Assigning an optional will always change the target of the reference. You cannot pass rvalues.
If XValue is true, you still cannot pass rvalues, but the result of value()/value_or() will return an rvalue reference, to allow moving of the stored value into something else.
Depending on the const-ness of T is the reference to const or non-const as well, unless XValue is true, in which caseTmust not beconst`.
type_safe::reference_optional_storage::reference_optional_storagereference_optional_storage() noexcept;
Effects: Creates it without a bound reference.
type_safe::reference_optional_storage::create_valuetemplate <typename U, typename = decltype(std::declval<T*&>()=std::declval<U*>())>
)>void create_value(const basic_optional<reference_optional_storage<U, XValue>>& ref);
Effects: Binds the same reference as stored in the optional.
Notes: This function only participates in overload resolution, if U is a reference compatible with T. \param 1 \exclude
type_safe::reference_optional_storage::create_valuevoid create_value(const reference_optional_storage& other) noexcept;
Effects: Binds the reference to the same reference as in other.
type_safe::reference_optional_storage::create_valuevoid create_value(const object_ref<T, XValue>& other) noexcept;
Effects: Binds the reference to the same reference as in ref.
type_safe::reference_optional_storage::create_valuevoid create_value(std::nullptr_t) noexcept;
Effects: Same as destroy_value().
type_safe::reference_optional_storage::create_value_explicittemplate <typename U, typename = decltype(std::declval<T*&>()=std::declval<U*>())>
)>void create_value_explicit(U& obj) noexcept;
Effects: Binds the reference to obj.
Notes: This function only participates in overload resolution, if U is a reference compatible with T. \param 1 \exclude
type_safe::reference_optional_storage::copy_valuevoid copy_value(const reference_optional_storage& other) noexcept;
Effects: Binds the reference to the same reference in other.
type_safe::reference_optional_storage::swap_valuevoid swap_value(reference_optional_storage& other) noexcept;
Effects: Swaps the reference with the reference in other, i.e. rebinds them, no value change.
type_safe::reference_optional_storage::destroy_valuevoid destroy_value() noexcept;
Effects: Unbinds the reference.
type_safe::reference_optional_storage::has_valuebool has_value() const noexcept;
Returns: true if the reference is bound, false otherwise.
type_safe::reference_optional_storage::get_value'hidden' get_value() const noexcept;
Returns: The target of the reference. Depending on XValue, this will either be T& or T&&.
type_safe::reference_optional_storage::get_value_or'hidden' get_value_or(lvalue_reference other) const noexcept;
Returns: Either get_value() or other. This must be given an lvalue of type T and it returns either an lvalue or an rvalue, depending on XValue.
type_safe::optional_ref [optional]template <typename T>
using optional_ref = basic_optional<reference_optional_storage<T>>;
A ts::basic_optional that uses ts::reference_optional_storage. It is an optional reference.
Notes: T is the type without the reference, i.e. optional_ref<int>.
type_safe::opt_ref [optional]template <typename T>
optional_ref<T> opt_ref(const object_ref<T>& ref) noexcept;
Returns: A ts::optional_ref to the same target as ref.
type_safe::opt_cref [optional]template <typename T>
optional_ref<const T> opt_cref(const object_ref<T>& ref) noexcept;
Returns: A ts::optional_ref to const to the same target as ref.
type_safe::opt_ref [optional]template <typename T>
optional_ref<T> opt_ref(T& ref) noexcept;
Returns: A ts::optional_ref to the given object.
type_safe::opt_cref [optional]template <typename T>
optional_ref<const T> opt_cref(const T& ref) noexcept;
Returns: A ts::optional_ref to the given object.
type_safe::opt_ref [optional]template <typename T>
optional_ref<T> opt_ref(optional<T>& opt) noexcept;
Returns: A ts::optional_ref to the stored value in opt.
type_safe::opt_cref [optional]template <typename T>
optional_ref<const T> opt_cref(const optional<T>& opt) noexcept;
Returns: A ts::optional_ref to const to the stored value in opt.
type_safe::opt_ref [optional]template <typename T>
optional_ref<T> opt_ref(T* ptr) noexcept;
Returns: A ts::optional_ref<T> to the pointee of ptr or nullopt.
type_safe::opt_cref [optional]template <typename T>
optional_ref<const T> opt_cref(const T* ptr) noexcept;
Returns: A ts::optional_ref<T> to const to the pointee of ptr or nullopt.
type_safe::optional_xvalue_reftemplate <typename T>
using optional_xvalue_ref = basic_optional<reference_optional_storage<T, true>>;
A ts::basic_optional that uses ts::reference_optional_storage with XValue being true. It is an optional reference to an xvalue, i.e. an lvalue that can be moved from, like returned by std::move(). \notes T is the type without the reference, i.e. optional_xvalue_ref<int>. \module optional
type_safe::opt_xref [optional]template <typename T>
optional_xvalue_ref<T> opt_xref(T* ptr) noexcept;
Returns: A ts::optional_xvalue_ref<T> to the pointee of ptr or nullopt.
Notes: The pointee will be moved from when you call value().
type_safe::opt_xref [optional]template <typename T>
optional_xvalue_ref<T> opt_xref(T& obj) noexcept;
Returns: A ts::optional_xvalue_ref<T> to the given object.
Notes: The pointee will be moved from when you call value().
type_safe::copy [optional]template <typename T>
optional<typename std::remove_const<T>::type> copy(const optional_ref<T>& ref);
Returns: A ts::optional<T> containing a copy of the value of ref if there is any value.
Requires: T must be copyable.
type_safe::movetemplate <typename T>
optional<T> move(const optional_xvalue_ref<T>& ref) noexcept('hidden');
Returns: A ts::optional<T> containing a copy of the value of ref created by move constructing if there is any value. \requires T must be moveable. \module optional